package com.spider.site.web.processor;

import java.util.ArrayList;
import java.util.List;


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.spider.site.entity.SpiderResult;
import com.spider.site.pojo.util.SpiderUtil;
import com.spider.site.service.SpiderService;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

/**
 * 虎牙定制 ， 虎牙似乎使用 websocket做聊天室（2018年6月11日,不知道以后是怎样的喔，自己console去看）
 * ，其实我可以选择模拟一个socket去连接,但是我忘记了该怎么设置，所以还是使用渲染的形式去抓取信息好了
 * 而且既然不是斗鱼那种放在flash的socket，那么简单的使用一个神器phantomjs即可
 * 这个是没有ui的浏览器内核，况且跨平台，节省了一波资源开销，大大的首选 假如 socket 不是放在flash && 你搞不懂
 * socket通信那块的东西，希望使用这个东西做渲染 至于怎么使用，请百度
 * 
 * @author wq
 *
 */
@Component
public class SpiderHuyaProcessor implements PageProcessor {

	private Site site = Site.me().setRetryTimes(3).setSleepTime(200);

//	private PhantomJSDriver phantomJSDriver = null;
//
//	@Value("${phantomJS.exe.dir}")
//	private String phantomJSExeDir;
//
//	@Value("${phantomJS.js.dir}")
//	private String phantomJSJsDir;

	@Autowired
	private SpiderUtil spiderUtil;
	
	@Autowired
	private SpiderService spiderService;

//	@PostConstruct
//	public void init() {// 初始化驱动信息
//		if (this.phantomJSDriver == null) {
//			DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
//			/* 放一些配置 */
//			desiredCapabilities.setCapability("acceptSslCerts", true);// ssl证书
//			desiredCapabilities.setCapability("takesScreenshot", false);// 截屏支持
//			desiredCapabilities.setCapability("cssSelectorsEnabled", true);// css搜索支持
//			desiredCapabilities.setJavascriptEnabled(true);// js支持
//			desiredCapabilities.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
//					this.phantomJSExeDir);// 驱动支持
//			this.phantomJSDriver = new PhantomJSDriver(desiredCapabilities);
//		}
//	}

	@Override
	public void process(Page page) {
		String url = page.getRequest().getUrl();
		SpiderResult spiderResult = this.spiderService.getByURL(url);
		WebDriver webDriver = new InternetExplorerDriver();
		webDriver.get(url);
		while (spiderResult.getIsSpin() == 1) {
			try {
				Thread.sleep(30 * 1000);// 睡眠30s抓取
				WebElement webElement = webDriver.findElement(By.xpath("/html"));
				Html html = new Html(webElement.getAttribute("outerHTML"));
				String author = spiderResult.getAuthor();// 主播
				String image = spiderResult.getImage();// 头像
				if (!spiderUtil.isNullOrEmpty(author, image)) {// 不经常变的东西
					author = html.xpath("//*[@id=\"J_roomHeader\"]/div[1]/div[2]/div[2]/h3/text()").get();// 主播
					image = html.xpath("//*[@id=\"avatar-img\"]/@src").get();// 头像
				}
				String name = html.xpath("//*[@id=\"J_roomTitle\"]/text(").get();// 直播间名称
				String number = "";// 热度
				if(spiderResult.getLiveNumber() != null) {
					number = spiderResult.getLiveNumber().toString();
				}
				String time = html.xpath("//*[@id=\"J_roomHeader\"]/div[1]/div[2]/div[2]/span[5]/span/text()").get();// 上次直播时间
				if(!this.isReplay(name)) {//假如不是重播则获取页面数据，因为虎牙（2018年6月13日）重播时没有人数显示
					number = html.xpath("//*[@id=\"live-count\"]/text()").get();
				}
				List<String> usernames = html.xpath("//*[@id=\"chat-room__list\"]/li/div[@class='msg-normal']/span[@class='name']/text()")
						.all();
				List<String> messages = html.xpath("//*[@id=\"chat-room__list\"]/li/div[@class='msg-normal']/span[@class='msg']/text()")
						.all();
				spiderUtil.savaSpiderData(spiderUtil.formatNumber(number), name, this.mergeHyComments(usernames, messages),
						author, spiderResult, image, url, time);// 保存数据（持久化）
				if (time != null && !"".equals(time) && !this.isReplay(name)) {// 不为空的话，蜘蛛侠就知道该主播已经下播，为了节省资源消费，应该将其关闭
					spiderResult.setIsSpin(0);
					spiderResult.setLastTime(time);
					this.spiderService.editUrl(spiderResult);
					break;
				} else {
					spiderResult = spiderService.getByURL(url);// 更新一下对象的状态
					spiderUtil.updateSpinStatus(spiderResult, 1);
				}
			} catch (Exception e) {
				e.printStackTrace();
				spiderUtil.exceptionCommon(e, url);//异常处理
				break;// 跳出循环
			}
		}
		spiderUtil.updateSpinStatus(spiderResult, 0);
		webDriver.quit();
	}

	/**
	 * 虎牙 评论合成
	 * 
	 * @param lists
	 * @return
	 */
	public List<String> mergeHyComments(List<String> usernames, List<String> messages) {
		List<String> list = new ArrayList<>();
		for (int i = 0; i < usernames.size(); i++) {
			if(messages.get(i).equals("")) {
				list.add(usernames.get(i) + ":" + "[表情]");
			}else {
				list.add(usernames.get(i) + ":" + messages.get(i));
			}
		}
		return list;
	}

	/**
	 * （虎牙）是否正在重播
	 * @return
	 */
	public boolean isReplay(String name) {
		if(name.split("重播：").length > 1) {
			return true;
		}
		return false;
	} 
	
	@Override
	public Site getSite() {
		return this.site;
	}
	
}
